package com.example.kotlin.basis

import java.math.BigInteger

/**
 * Created by xiao_tan on 17/7/23.
 * 递归和尾递归优化
 */


fun main(args: Array<String>) {

    println(com.example.kotlin.basis.fact(3))
    println(com.example.kotlin.basis.fact(4))
    println(com.example.kotlin.basis.fact(5))
    println(com.example.kotlin.basis.fact2(java.math.BigInteger("100")))

//    println(allAdd(2))
//    println(allAdd(10))
    println(com.example.kotlin.basis.allAdd(100, 0)) //出现StackOverflowError异常,计算机第93798次运算后挂掉了
}

//阶乘 1的阶乘 1,2的阶乘 2*1,3的阶乘3*2*1,4的阶乘4*3*2*1
//递归
fun fact(num: Int): Int {
    if (num == 1) return 1 else return num * com.example.kotlin.basis.fact(num - 1)
}

fun fact2(num: java.math.BigInteger): java.math.BigInteger {
    if (num == java.math.BigInteger.ONE) return java.math.BigInteger.ONE else return num * com.example.kotlin.basis.fact2(num - BigInteger.ONE)
}

//累加 1的累加 1,2的累加 2+1,3的累加 3+2+1,4的累加 4+3+2+1
//尾递归优化
tailrec fun allAdd(num: Int, result: Int): Int {
    println("计算机第${num}次运算,result=$result")
    if (num == 0) return result else return com.example.kotlin.basis.allAdd(num - 1, result + num)
}